package com.strive.village.exception;

import com.strive.village.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * @Author: strivePeng
 * @CreateTime: 2024年04月19日
 * @Description: 全局异常处理
 **/

@Slf4j // 打印日志
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * @param e 异常捕获
     * @return 返回处理信息
     * @description 非法数据异常处理
     * @author strivePeng
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST) // 400
    @ExceptionHandler(value = IllegalArgumentException.class)
    public Result handler(IllegalArgumentException e) {
        log.error("Assert异常：——————————{}", e.getMessage());
        return Result.fail("系统异常");
    }

    /**
     * @param e 捕获的异常
     * @return 返回处理信息
     * @description 运行时异常处理
     * @author strivePeng
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(value = RuntimeException.class)
    public Result handler(RuntimeException e) {
        log.error("运行时异常——————————{}", e.getMessage());
        return Result.fail("系统运行异常");
    }

    /**
     * 文件导出异常
     *
     * @param e 异常信息
     * @return 返回结果
     */
    public Result handler(EasyExcelException e) {
        log.error("文件导出异常————————————{}", e.getMessage());
        return Result.fail("文件导出导入异常");
    }


    /**
     * @param e 异常捕获
     * @return 返回校验信息
     * @description 实体校验异常
     * @author strivePeng
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST) // 400
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handler(MethodArgumentNotValidException e) {
        BindingResult result = e.getBindingResult();
        ObjectError error = result.getAllErrors().stream().findFirst().get();
        log.error("实体校验异常：——————————{}", error.getDefaultMessage());
        return Result.fail("系统异常");
    }

    /**
     * 数据库操作异常捕获
     */
    @ResponseStatus(HttpStatus.CONFLICT) // 409
    @ExceptionHandler(value = DuplicateKeyException.class)
    public Result handler(DuplicateKeyException e) {
        log.error("数据库唯一键约束异常：——————————{}", e.getMessage());
        if (e.getMessage().contains("Duplicate entry")) {
            return Result.fail("用户名已存在");
        }
        return Result.fail("数据库异常");
    }
}
